// 编程范式：命令式编程、声明式编程
// 编程范式：面向对象式编程、函数式编程

// filter/map/reduce
// filter的回调函数的一个要求：必须返回一个布尔值
// true: 当返回true时，函数内部会自动将n加入到新数组里；返回false则会过滤掉这次的n
// filter函数使用
const nums = [100, 10, 20, 30, 40, 400, 130, 135, 307]
let newNums = nums.filter(function(n){
    return n < 100;
});
console.log(newNums); // [10, 20, 30, 40]

// map函数使用
let newNums2 = newNums.map(function(n){
    return n * 2;
});
console.log(newNums2); // [20, 40, 60, 80]  

// reduce函数使用
let total = newNums2.reduce(function(previousValue, n){
    return previousValue + n;
}, 0);
console.log(total); // 200

// 链式写法(阅读性好)
let total2 = nums.filter(function(n){
    return n < 100;
}).map(function(n){
    return n * 2;
}).reduce(function(previousValue, n){
    return previousValue + n;
}, 0);
console.log(total2);